package com.jch.har.server;

import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.handler.timeout.IdleState;
import io.netty.handler.timeout.IdleStateEvent;

import java.text.SimpleDateFormat;
import java.util.Date;

public class ServerHandler extends ChannelInboundHandlerAdapter {

    private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");

    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        System.out.println(dateFormat.format(new Date()) + " 客户端: " + ctx.channel().remoteAddress().toString() + "接入服务器。");
        ctx.writeAndFlush("建立连接成功！ 服务器回执信息。\r\n"); // 通知客户端建立连接成功。
    }

    @Override
    public void channelInactive(ChannelHandlerContext ctx) throws Exception {
        System.err.println(dateFormat.format(new Date()) + " 客户端: " + ctx.channel().remoteAddress().toString() + " 主动断开连接。");
    }

    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        System.out.println(dateFormat.format(new Date()) + " 收到消息: " + msg);
        ctx.writeAndFlush("服务器成功收到消息。\r\n");
    }

    // 服务端实现心跳检查 设置用户事件
    @Override
    public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
        super.userEventTriggered(ctx, evt);
        if (evt instanceof IdleStateEvent) {
            IdleStateEvent event = (IdleStateEvent) evt;
            if (event.state() == IdleState.READER_IDLE) {
                System.err.println(dateFormat.format(new Date()) + " READER IDLE 服务端主动关闭客户端连接.");
                ctx.writeAndFlush("读取等待: 服务端释放客户端连接。\r\n");
                ctx.close();
            } else if (event.state() == IdleState.WRITER_IDLE) {
                System.err.println(dateFormat.format(new Date()) + " WRITER IDLE");
                ctx.writeAndFlush("写入等待: 客户端连接。\r\n");
            } else if (event.state() == IdleState.ALL_IDLE) {
                System.err.println(dateFormat.format(new Date()) + " ALL IDLE");
                ctx.writeAndFlush("全部时间: 客户端连接无操作。\r\n");
            }
        }
        ctx.flush(); //刷新全部消息 通道内的
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        System.err.println(dateFormat.format(new Date()) + " 出现异常: " + cause.getMessage());
        ctx.close();
    }
}
